package com.season.seasonStudy.javase.j_011_reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Reflect {
	public static void main(String[] args) {
		String classname = "entity.Dept";
		String fieldname = "dname";
		String value = "财务部";
		// 通过属性名组合set方法名
		String methordName = "set" + fieldname.substring(0, 1).toUpperCase()
				+ fieldname.substring(1);

		try {
			Class c = Class.forName(classname);// 通过类的地址
			// Class c=Dept.class; //通过类名
			// Class c=dept.getClass(); //通过对象名获取
			Object obj = c.newInstance(); // 初始化对象

			// -------------------------------------------------
			// 解析属性
			Field[] field = c.getDeclaredFields();// 获取该类所有属性
			for (Field field2 : field) {
				System.out.println(Modifier.toString(field2.getModifiers())// 修饰符
						+ " " + field2.getName()
						+ " "
						+ field2.getType().getSimpleName());
			}
			// ----------------------------------------------------
			Field fie = c.getDeclaredField(fieldname);// 获取指定名字的属性
			System.out.println(Modifier.toString(fie.getModifiers())// 修饰符获取
					+ " " + fie.getName() + " "// 获取属性名
					+ fie.getType());// 获取属性类型 获得Class对象
			// class对象的getSimpleName()方法 获取类型的简单名称
			// -----------------------------------------------
			// 方法解析
			Method[] meths = c.getDeclaredMethods();// 获取c这个Class的所有方法
			for (Method method : meths) {
				Class[] clparam = method.getParameterTypes();// 方法参数类型列表
				String param = "";
				for (Class class1 : clparam) {
					param += class1.getSimpleName() + ",";
				}
				System.out.println(Modifier.toString(method.getModifiers())//获取方法修饰符
						+" "+method.getReturnType()//获取方法返回值类型
						+" "+method.getName()//获取方法名
						+"("+param+")");
			}
//-----------------------------------------------
			Class[] v={fie.getType()};
			//根据方法名和方法参数获取定义的方法对象
			Method me=c.getDeclaredMethod(methordName, v);
			Object[] values={value};
			//调用object对象的定义的方法对象，传values参数值
			me.invoke(obj, values);
			System.out.println(obj);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}
